// 递归包裹嵌套对象
// 你需要写一个函数，对每一层对象都使用 Proxy 包一层。
// 创建一个 WeakMap 来缓存已经代理过的对象，避免重复代理
const reactiveMap = new WeakMap();

function deepReactive(obj) {
  // 非对象（如字符串、数字、null 等）不需要代理，直接返回
  if (typeof obj !== 'object' || obj === null) return obj;

  // 如果这个对象已经被代理过，直接返回缓存的代理
  if (reactiveMap.has(obj)) return reactiveMap.get(obj);

  // 创建代理对象
  const proxy = new Proxy(obj, {
    get(target, key, receiver) {
      const value = Reflect.get(target, key, receiver); // 安全地获取属性
      console.log('get:', key);

      // 如果获取的是一个对象，再次调用 deepReactive 递归代理它
      return deepReactive(value);
    },
    set(target, key, value, receiver) {
      console.log('set:', key, '=', value);
      // 安全地设置属性
      return Reflect.set(target, key, value, receiver);
    }
  });

  // 把当前代理的对象缓存起来，防止重复创建
  reactiveMap.set(obj, proxy);

  return proxy;
}
const state = deepReactive({
  user: {
    name: 'Alice',
    address: {
      city: 'Beijing'
    }
  }
});

state.user.name = 'Bob';         // 会触发 set
state.user.address.city = 'SH';  // ✅ 也会触发 set（递归监听了 address）
